import cloneDeepWith from 'lodash/cloneDeepWith';
import {checkDataType} from './checkDataType.js';

const tools = {
 /**
  * 防抖函数
  * @param {Function} fn 回调函数
  * @param {Number} delay 延迟时间
  */
  debounce (fn, delay) {
    let timer;

    return function () {
      const context = this;
      const args = arguments;

      clearTimeout(timer);

      timer = setTimeout(function () {
        fn.apply(context, args);
      }, delay);
    };
  },

    /**
     * 节流函数
     * @param {Function} fn 回调函数
     * @param {*} threshhold 时间间隔
     */
  throttle (fn, threshhold) {
    let last, timer;

    threshhold || (threshhold = 250);

    return function () {
      const context = this;
      const args = arguments;
      const now = +new Date();

      if (last && now < last + threshhold) {
        clearTimeout(timer);

        timer = setTimeout(function () {
          last = now;
          fn.apply(context, args);
        }, threshhold);
      } else {
        last = now;
        fn.apply(context, args);
      }
    };
  },

    /**
     * 深拷贝函数
     * @param {Object}} obj copy 对象
     */
  deepClone (obj) {
    return cloneDeepWith(obj);
  },

    /**
     * 对象比较
     * @param {Object} a 对象 a
     * @param {Object} b 对象 b
     */
  isObjEqual (a, b) {
    let p, t;

    for (p in a) {
      if (typeof b[p] === 'undefined') {
        return false;
      }
      if (b[p] && !a[p]) {
        return false;
      }
      t = typeof a[p];
      if (t === 'object' && !this.isObjEqual(a[p], b[p])) {
        return false;
      }
      if (t === 'function' && (typeof b[p] === 'undefined' || a[p].toString() !== b[p].toString())) {
        return false;
      }
      if (a[p] !== b[p]) {
        return false;
      }
    }
    for (p in b) {
      if (typeof a[p] === 'undefined') {
        return false;
      }
    }
    return true;
  },

    /**
     * 判断传入值是否为空
     * @param {Any} value 值
     */
  isEmpty (value) {
    const dataType = checkDataType(value);
    let isEmpty;

    switch (dataType) {
      case 'String':
        isEmpty = value === '';
        break;
      case 'Array':
        isEmpty = !value.length;
        break;
      case 'Object':
        isEmpty = !Object.keys(value).length;
        break;
      default:
        isEmpty = false;
    }
    return isEmpty;
  },

    /**
     * 时间转化函数，毫秒转换为特定字符串格式
     * @param {String|Number} time 时间
     */
  timeTransform (time) {
    const val = Number(time);

    if (val > 0) {
      if (val < 60) {
        return val + window.gettext(' 秒');
      } else if (val < 3600) {
        return parseFloat(val / 60).toFixed(1) + window.gettext(' 分');
      } else if (val < 86400) {
        return parseFloat(val / 3600).toFixed(1) + window.gettext(' 小时');
      } else {
        return parseFloat(val / 86400).toFixed(1) + window.gettext(' 天');
      }
    } else {
      return '--';
    }
  }
};

export default tools;
